home *** CD-ROM | disk | FTP | other *** search
/ GFX Sensations 1 / Graphic Sensations - Volume 1.iso / tools / amiga / 3d_tools / irit40s.lha / Irit / irit / inptprsl.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-30  |  10.4 KB  |  383 lines

  1. /*****************************************************************************
  2. *   "Irit" - the 3d (not only polygonal) solid modeller.             *
  3. *                                         *
  4. * Written by:  Gershon Elber                Ver 0.2, Mar. 1990   *
  5. ******************************************************************************
  6. *   General, local to module, definitions for the Input Parser module.         *
  7. *   Note this module actually consists of InptPrsr/InptEval/OverLoad modules.*
  8. *****************************************************************************/
  9.  
  10. #ifndef    INPT_PRSR_LH
  11. #define    INPT_PRSR_LH
  12.  
  13. /* #define DEBUG        Print some intermediate results (InptPrsr/InptEval). */
  14.  
  15. #define MAX_PARSER_STACK    500         /* Depth of expression nesting. */
  16.  
  17. typedef enum {
  18.     POLY_EXPR =     0x0001,
  19.     NUMERIC_EXPR =  0x0002,
  20.     POINT_EXPR    =   0x0004,
  21.     VECTOR_EXPR    =   0x0008,
  22.     PLANE_EXPR    =   0x0010,
  23.     MATRIX_EXPR    =   0x0020,
  24.     CURVE_EXPR =    0x0040,
  25.     SURFACE_EXPR =  0x0080,
  26.     STRING_EXPR    =   0x0100,
  27.     OLST_EXPR =     0x0200,
  28.     CTLPT_EXPR =    0x0400,
  29.  
  30.     NO_EXPR =       0x1000,
  31.     POLY_CURVE_EXPR = POLY_EXPR | CURVE_EXPR,
  32.     GEOM_EXPR =     POLY_EXPR | CURVE_EXPR | SURFACE_EXPR,
  33.     OLST_GEOM_EXPR = OLST_EXPR | GEOM_EXPR,
  34.     ANY_EXPR =      POLY_EXPR | NUMERIC_EXPR | POINT_EXPR | VECTOR_EXPR |
  35.                 PLANE_EXPR | MATRIX_EXPR | CURVE_EXPR | SURFACE_EXPR |
  36.             STRING_EXPR | OLST_EXPR | CTLPT_EXPR,
  37.  
  38.     ERROR_EXPR =    0x4000
  39. } IritExprType;
  40.  
  41. /*****************************************************************************
  42. * The expression parse tree node definition:                     *
  43. *****************************************************************************/
  44. typedef    struct ParseTree {
  45.     struct ParseTree *Right, *Left;
  46.     int NodeKind;
  47.     IPObjectStruct *PObj;
  48.     struct UserDefinedFuncDefType *UserFunc;
  49. } ParseTree;
  50.  
  51. /* See also IPObjectStruct structure for the different object possible: */
  52. #define IS_POLY_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_POLY)
  53. #define IS_NUM_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_NUMERIC)
  54. #define IS_PT_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_POINT)
  55. #define IS_VEC_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_VECTOR)
  56. #define IS_PLANE_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_PLANE)
  57. #define IS_CTLPT_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_CTLPT)
  58. #define IS_MAT_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_MATRIX)
  59. #define IS_STR_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_STRING)
  60. #define IS_OLST_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_LIST_OBJ)
  61. #define IS_CRV_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_CURVE)
  62. #define IS_SRF_NODE(Node)    ((Node) -> PObj -> ObjType == IP_OBJ_SURFACE)
  63.  
  64. /*****************************************************************************
  65. * The include file stack - nesting is allowed up to FILE_STACK_SIZE.         *
  66. *****************************************************************************/
  67. typedef struct FileStackStruct {
  68.     char Name[FILE_NAME_LEN];
  69.     FILE *f;
  70. } FileStackStruct;
  71.  
  72. #define FILE_STACK_SIZE    10
  73.  
  74. /*****************************************************************************
  75. * Function entry table looks like this (for table see InptPrsr.c module):    *
  76. *****************************************************************************/
  77. #define FUNC_NAME_LEN    31                /* 10 + NULL terminator. */
  78. #define FUNC_MAX_PARAM    5        /* Max. of all the function types below. */
  79. #define ANY_PARAM_NUM    127
  80.  
  81. typedef struct FuncTableType {
  82.     char FuncName[FUNC_NAME_LEN];
  83.     int FuncToken;
  84.     void (*Func)();
  85.     ByteType NumOfParam;
  86.     IritExprType ParamObjType[FUNC_MAX_PARAM];
  87.     IritExprType RetType;
  88. } FuncTableType;
  89.  
  90. typedef struct NumFuncTableType {
  91.     char FuncName[FUNC_NAME_LEN];
  92.     int FuncToken;
  93.     double (*Func)();
  94.     ByteType NumOfParam;
  95.     IritExprType ParamObjType[FUNC_MAX_PARAM];
  96.     IritExprType RetType;
  97. } NumFuncTableType;
  98.  
  99. typedef struct ObjFuncTableType {
  100.     char FuncName[FUNC_NAME_LEN];
  101.     int FuncToken;
  102.     IPObjectStruct *(*Func)();
  103.     ByteType NumOfParam;
  104.     IritExprType ParamObjType[FUNC_MAX_PARAM];
  105.     IritExprType RetType;
  106. } ObjFuncTableType;
  107.  
  108. typedef struct GenFuncTableType {
  109.     char FuncName[FUNC_NAME_LEN];
  110.     int FuncToken;
  111.     void (*Func)();
  112.     ByteType NumOfParam;
  113.     IritExprType ParamObjType[FUNC_MAX_PARAM];
  114.     IritExprType RetType;
  115. } GenFuncTableType;
  116.  
  117. typedef struct ConstantTableType {
  118.     char FuncName[FUNC_NAME_LEN];
  119.     RealType Value;
  120. } ConstantTableType;
  121.  
  122. typedef struct UserDefinedFuncDefType {
  123.     struct UserDefinedFuncDefType *Pnext;
  124.     char FuncName[FUNC_NAME_LEN];
  125.     int IsFunction;
  126.     int NumParams;
  127.     IPObjectStruct *Params;
  128.     IPObjectStruct *LocalVars;
  129.     ParseTree *Body;
  130. } UserDefinedFuncDefType;
  131.  
  132. /* The followings are defined in the InptEval.c module and are globals so   */
  133. /* InptPrsr.c module will be able to access them...                */
  134. extern NumFuncTableType NumFuncTable[];
  135. extern int NumFuncTableSize;
  136. extern ObjFuncTableType ObjFuncTable[];
  137. extern int ObjFuncTableSize;
  138. extern GenFuncTableType GenFuncTable[];
  139. extern int GenFuncTableSize;
  140. extern ConstantTableType ConstantTable[];
  141. extern int ConstantTableSize;
  142. extern UserDefinedFuncDefType *UserDefinedFuncList;
  143.  
  144. /*****************************************************************************
  145. * Tokens used in the expression    to tree    conversion and tree definition.         *
  146. *****************************************************************************/
  147.  
  148. #define    TOKENERROR  0
  149. #define TOKEN_NONE  1
  150.  
  151. /* Warning - changing the order of these constants, needs updating the order */
  152. /* of them, in the tables in the begining of InptPrsr.c & OverLoad.c modules.*/
  153.  
  154. typedef enum {
  155.     USERFUNCDEF = 90,               /* Function and procedure definition. */
  156.     USERPROCDEF,
  157.     USERINSTDEF
  158. } UserDefinedFuncType;
  159.  
  160. #define USER_FUNC    0
  161. #define IS_USER_FUNCTION(Token)        (Token >= USERFUNCDEF && \
  162.                      Token <= USERINSTDEF)
  163.  
  164. typedef enum {                   /* Real value returned functions. */
  165.     ARCCOS = 100,
  166.     ARCSIN,
  167.     ARCTAN2,
  168.     ARCTAN,
  169.     COS,
  170.     EXP,
  171.     FABS,
  172.     LN,
  173.     LOG,
  174.     SIN,
  175.     SQRT,
  176.     TAN,
  177.     CPOLY,
  178.     AREA,
  179.     VOLUME,
  180.     TIME,
  181.     LISTSIZE,
  182.     THISOBJ
  183. } RealValueFuncType;
  184.  
  185. #define NUM_FUNC    100
  186. #define NUM_FUNC_OFFSET    100
  187. #define IS_NUM_FUNCTION(Token)        (Token >= 100 && Token < 200)
  188.  
  189. typedef enum {                       /* Object returned Functions. */
  190.     POINT = 200,
  191.     VECTOR,
  192.     PLANE,
  193.     CTLPT,
  194.     ROTX,
  195.     ROTY,
  196.     ROTZ,
  197.     TRANS,
  198.     SCALE,
  199.     BOX,
  200.     GBOX,
  201.     CONE,
  202.     CONE2,
  203.     CYLIN,
  204.     SPHERE,
  205.     TORUS,
  206.     CIRCPOLY,
  207.     POLY,
  208.     CROSSEC,
  209.     SURFREV,
  210.     EXTRUDE,
  211.     LIST,
  212.     LOAD,
  213.     CONVEX,
  214.     SBEZIER,
  215.     CBEZIER,
  216.     SBSPLINE,
  217.     CBSPLINE,
  218.     SEVAL,
  219.     CEVAL,
  220.     STANGENT,
  221.     CTANGENT,
  222.     SNORMAL,
  223.     SDIVIDE,
  224.     CDIVIDE,
  225.     SREGION,
  226.     CREGION,
  227.     SREFINE,
  228.     CREFINE,
  229.     SRAISE,
  230.     CRAISE,
  231.     CSURFACE,
  232.     CMESH,
  233.     NTH,
  234.     GPOLYGON,
  235.     GPOLYLINE,
  236.     CIRCLE,
  237.     ARC,
  238.     RULEDSRF,
  239.     BOOLSUM,
  240.     BOOLONE,
  241.     SFROMCRVS,
  242.     SWEEPSRF,
  243.     OFFSET,
  244.     AOFFSET,
  245.     COERCE,
  246.     CEDITPT,
  247.     SEDITPT,
  248.     MERGEPOLY,
  249.     SMORPH,
  250.     BZR2BSP,
  251.     BSP2BZR,
  252.     SMERGE,
  253.     CDERIVE,
  254.     SDERIVE,
  255.     SNRMLSRF,
  256.     SYMBPROD,
  257.     SYMBDPROD,
  258.     SYMBCPROD,
  259.     SYMBSUM,
  260.     SYMBDIFF,
  261.     HOMOMAT,
  262.     CINFLECT,
  263.     CCRVTR,
  264.     CZEROS,
  265.     CEXTREMES,
  266.     CCINTER,
  267.     NIL,
  268.     COORD,
  269.     COMPOSE,
  270.     PRISA,
  271.     CRVPTDIST,
  272.     CRVLNDIST,
  273.     ADAPISO,
  274.     PDOMAIN
  275. } ObjValueFuncType;
  276.  
  277. #define OBJ_FUNC    200
  278. #define OBJ_FUNC_OFFSET    200
  279. #define IS_OBJ_FUNCTION(Token)        (Token >= 200 && Token < 300)
  280.  
  281. typedef enum {           /* General Functions/No value returned functions. */
  282.     EXIT = 300,
  283.     VIEWOBJ,
  284.     CHDIR,
  285.     INCLUDE,
  286.     SAVE,
  287.     FREEOBJ,
  288.     PAUSE,
  289.     IFCOND,
  290.     FORLOOP,
  291.     PRHELP,
  292.     VARLIST,
  293.     SYSTEM,
  294.     LOGFILE,
  295.     COLOR,
  296.     SNOC,
  297.     ATTRIB,
  298.     FFCOMPAT,
  299.     IRITPRINT,
  300.     COMMENT = 399
  301. } GenValueFuncType;
  302.  
  303. #define GEN_FUNC    300
  304. #define GEN_FUNC_OFFSET    300
  305. #define IS_GEN_FUNCTION(Token)        (Token >= 300 && Token < 400)
  306.  
  307. #define IS_FUNCTION(Token)              (Token >= 90 && Token < 400)
  308. #define IS_NO_PARAM_FUNC(Token)        (Token == EXIT || Token == VARLIST || \
  309.                      Token == NIL)
  310.  
  311. typedef enum {                               /* Operators. */
  312.     PLUS = 400,
  313.     MINUS,
  314.     MULT,
  315.     DIV,
  316.     POWER,
  317.     UNARMINUS,
  318.     EQUAL,
  319.     COMMA,
  320.     COLON,
  321.     SEMICOLON,
  322.     CMP_EQUAL,
  323.     CMP_NOTEQUAL,
  324.     CMP_LSEQUAL,
  325.     CMP_GTEQUAL,
  326.     CMP_GREAT,
  327.     CMP_LESS,
  328.     BOOL_AND,
  329.     BOOL_OR,
  330.     BOOL_NOT,
  331.  
  332.     OPENPARA = 430,                         /* Paranthesis. */
  333.     CLOSPARA,
  334.  
  335.     NUMBER = 450,                        /* Numeric Data. */
  336.     PARAMETER,                     /* Point on new/old object. */
  337.     STRING,             /* Sequence of characters within double quotes. */
  338.  
  339.     TOKENSTART = 490,
  340.     TOKENEND
  341. } GenericTokenType;
  342.  
  343. #define OPERATORS   400
  344. #define OPERATORS_OFFSET    400
  345.  
  346. extern char IPGlblCharData[INPUT_LINE_LEN];   /* Used for both parse & eval. */
  347. extern InptPrsrEvalErrType IPGlblEvalError;     /* Global used by EvalTree. */
  348.  
  349. /*****************************************************************************
  350. *   The local function (static) prototypes:                     *
  351. *   Note that if DEBUG is defined for the preprocessor, few more function    *
  352. * become available:                                 *
  353. *   Also note that some of the routines are defined globals as both the      *
  354. * InptPrsr.c and InptEval.c modules needs them.                     *
  355. *****************************************************************************/
  356.  
  357. ParseTree *ExprMalloc(void);
  358. void ExprFree(ParseTree *Ptr);
  359. void UpdateCharError(char *StrMsg, int Token);
  360. void FileInclude(char *FileName);
  361. IritExprType InptPrsrTypeCheck(ParseTree *Root, int Level);   /* Type check. */
  362. ParseTree *InptPrsrEvalTree(ParseTree *Root, int Level);   /* Evaluate tree. */
  363. void InptPrsrFreeTree(ParseTree *Root);               /* Free all tree. */
  364. void InptPrsrPrintTree(ParseTree *Root, char *str);          /* print it... */
  365. ParseTree *InptPrsrCopyTree(ParseTree *Root);             /* Copy it. */
  366. ParseTree *InptEvalFetchParameter(ParseTree *Root, int i, int n);
  367. int InptEvalCountNumParameters(ParseTree *Root);
  368.  
  369. void InptEvalPrintHelp(char *HelpHeader);
  370. ParseTree *InptEvalCompareObject(ParseTree *Root,
  371.                  ParseTree *Left, ParseTree *Right,
  372.                  InptPrsrEvalErrType *IError, char *CError);
  373. void InptEvalIfCondition(ParseTree *Cond,
  374.              ParseTree *CondTrue, ParseTree *CondFalse);
  375. void InptEvalForLoop(ParseTree *PStart, ParseTree *PInc, ParseTree *PEnd,
  376.                              ParseTree *PBody);
  377. IPObjectStruct *InptEvalGenObjectList(ParseTree *PObjParams);
  378. IPObjectStruct *InptEvalCtlPtFromParams(ParseTree *PObjParams);
  379. void InptEvalDefineFunc(ParseTree *FuncDef);
  380. ParseTree *InptEvalUserFunc(ParseTree *Root, ParseTree *Params[]);
  381.  
  382. #endif    /* INPT_PRSR_LH */
  383.